package 基础.线程_队列_线程池;


import java.text.SimpleDateFormat;
import java.util.Date;

class DateUtil{
    //SimpleDateFormat对象是一个线程不安全的对象(不能多线程共享使用,除非加锁)
    //private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
    //ThreadLocal(线程本地变量)
    //这个对象提供了这样的一种机制,能够将某个对象存储到当前线程的map中,需要时从当前线程map种取存储的对象.
    private static ThreadLocal<SimpleDateFormat> threadLocal=new ThreadLocal<>();
    public static Date parseStr(String dateStr){
        //1.从当前线程获取SimpleDateFormat对象
        SimpleDateFormat sdf=threadLocal.get();//map.get(threadLocal)
        //2.假如当前线程没有SimpleDateFormat,则创建对象,存储到当前线程
        if(sdf==null){
            System.out.println("create SimpleDateFormat");
            sdf=new SimpleDateFormat("yyyy/MM/dd");
            threadLocal.set(sdf);//存储到线程 map.put(threadLocal,sdf)
        }
        try {
            return sdf.parse(dateStr);
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void remove(){
        threadLocal.remove();
    }
}

public class ThreadLocalTests {

    public static void main(String[] args) {
        for(int i=0;i<5;i++){
            new Thread(()->{
                for(int j=0;j<5;j++) {
                    Date d1 = DateUtil.parseStr("2023/07/06");
                    //System.out.println(d1);
                }
                DateUtil.remove();
            }).start();
        }
    }
}
